// 入口文件

// 加载模块
const express = require('express');
const path = require('path');
const usersRouter = require('./routers/usersRouter.js');
const goodsRouter = require('./routers/goodsRouter.js');

// 加载执行连接数据库模块
require('./db/connect.js');

// 创建express实例
let app = express();

// 配置COSR跨域资源共享1:
/* // 1.安装cors中间件
// npm i cors
// 2.加载模块
const cors = require('cors');
// 3.使用中间件
app.use('/',cors()); */

// 配置COSR跨域资源共享2:
app.all("*",function(req,res,next){
    //设置允许跨域的域名，*代表允许任意域名访问
    res.header("Access-Control-Allow-Origin","*")
    //允许的header类型
    res.header("Access-Control-Allow-Headers","Content-Type")
    //允许的跨域请求方式 
    res.header("Access-Control-Allow-Methods","POST,GET")
    next()
});


/* // 服务端操作cookie
// 使用cookie-parser插件来操作cookie
// 安装插件：npm i cookie-parser
// 加载模块
const cookirParser = require('cookie-parser');
// 使用插件
app.use(cookirParser());
// 使用cookie-parser插件之后：
// 1.请求头中的cookie数据被解析并保存在req.cookies属性上
// 2.在响应对象res上有一个cookie方法，用于设置cookie（在响应头中设置cookie） */


/* // 使用express-session插件来操作session
// express-session插件会自动操作cookie
// 安装插件：npm i express-session
// 加载模块 
const session = require('express-session');
// 使用插件
app.use('/',session({// 配置
    secret: 'hehehaha',// 加密口令
    resave: true,// 是否重新存储session(有效期更新)
    saveUninitialized: false,// 是否保存未初始化的session
    name: 'nicai',// 设置cookie的key名，默认为 'connect.sid'
    cookie: {
        maxAge: 1000*60*30,// 有效期，毫秒
        domain: 'localhost',// 域名
        path: '/'// 路径
    }
})); */


/* // 在nodejs中使用jwt：
// 1.安装JWT：npm i jsonwebtoken
// 2.加载模块
const jwt = require('jsonwebtoken');
// 3.生成token
// jwt.sign({payload},'加密口令',{其他设置})方法用于创建一个token
let token = jwt.sign({
    "username":"xiaocuo",
    "nickname":"小错"
},'hehehahaxixi',{expiresIn:3});

// expiresIn:3 有效期为3秒
// expiresIn:'7d' 有效期为7天
// console.log( token );// 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InhpYW9jdW8iLCJuaWNrbmFtZSI6IuWwj-mUmSIsImlhdCI6MTY5NDU3MzIzMywiZXhwIjoxNjk0NTczMjM2fQ.MlB9Z0v7b4JIEF44HYcxDXv4FB_-PtTAeKkR-nTNfkw'

// 验证token:
// jwt.verify(token,'加密口令',callback)方法用于验证token是否有效

// 有效的token:
setTimeout(()=>{
    jwt.verify(token,'hehehahaxixi',(err,payload)=>{
        // err 验证成功时为null，验证失败时为错误对象
        // payload 验证成功时，为创建token时存储的信息
        if (err) {
            console.log( '验证失败',err );
        } else {
            console.log( '验证成功',payload );
            // payload = {
            //     username: 'xiaocuo',
            //     nickname: '小错',
            //     iat: 1694573757,
            //     exp: 1694573760
            // }
        }
    });
},2000); */

/* // 无效的token:
setTimeout(()=>{
    jwt.verify(token,'hehehahaxixi',(err,payload)=>{
        // err 验证成功时为null，验证失败时为错误对象
        // payload 验证成功时，为创建token时存储的信息
        if (err) {
            console.log( '验证失败',err );
            // err -> TokenExpiredError: jwt expired
        } else {
            console.log( '验证成功',payload );
        }
    });
},3100); */

/* // 无效的token:
setTimeout(()=>{
    jwt.verify(token,'hehehaha123',(err,payload)=>{
        // err 验证成功时为null，验证失败时为错误对象
        // payload 验证成功时，为创建token时存储的信息
        if (err) {
            console.log( '验证失败',err );
            // err -> JsonWebTokenError: invalid signature
        } else {
            console.log( '验证成功',payload );
        }
    });
},1000); */

/* // 无效的token:
setTimeout(()=>{
    jwt.verify(token+'abc','hehehahaxixi',(err,payload)=>{
        // err 验证成功时为null，验证失败时为错误对象
        // payload 验证成功时，为创建token时存储的信息
        if (err) {
            console.log( '验证失败',err );
            // err -> JsonWebTokenError: invalid signature
        } else {
            console.log( '验证成功',payload );
        }
    });
},1000);
 */

// 指定静态资源目录
// 访问 http://localhost:9090/static 就可以访问到www目录
app.use('/static',express.static(path.join(__dirname,'www')));

// 解析请求体中的数据
app.use(express.json());// 解析json数据
app.use(express.urlencoded({extended:true}));// 解析查询字符串数据

// 使用路由表来匹配请求
// http://localhost:9090/users/center
// http://localhost:9090/goods/update
app.use('/users',usersRouter);
app.use('/goods',goodsRouter);

// 监听端口号
app.listen(9090,()=>{
    console.log( '----------------服务启动成功----------------' );
});
